"""
工具函数模块

提供项目所需的通用工具函数：
- 密码加密和验证
- Token 生成和验证
"""

from typing import Optional
from datetime import datetime, timedelta


# ========== 密码处理 ==========


def hash_password(password: str) -> str:
    """
    密码加密（简化版，生产环境应使用 bcrypt 或 passlib）
    
    Args:
        password: 原始密码
        
    Returns:
        加密后的密码
    """
    # 实际项目中应该使用：
    # from passlib.context import CryptContext
    # pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
    # return pwd_context.hash(password)
    
    # 这里为了演示简化，只是添加前缀
    return f"hashed_{password}"


def verify_password(plain_password: str, hashed_password: str) -> bool:
    """
    验证密码
    
    Args:
        plain_password: 原始密码
        hashed_password: 加密后的密码
        
    Returns:
        密码是否匹配
    """
    # 实际项目中应该使用：
    # return pwd_context.verify(plain_password, hashed_password)
    
    return hash_password(plain_password) == hashed_password


# ========== Token 处理 ==========


def create_access_token(username: str, expires_delta: Optional[timedelta] = None) -> str:
    """
    创建访问令牌（简化版，生产环境应使用 JWT）
    
    Args:
        username: 用户名
        expires_delta: 过期时间增量
        
    Returns:
        访问令牌字符串
    """
    # 实际项目中应该使用：
    # from jose import jwt
    # to_encode = {"sub": username, "exp": datetime.utcnow() + expires_delta}
    # encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    # return encoded_jwt
    
    # 这里为了演示简化，返回 token_username 格式
    return f"token_{username}"


def verify_token(token: str) -> Optional[str]:
    """
    验证并解析令牌
    
    Args:
        token: 访问令牌
        
    Returns:
        用户名，如果令牌无效则返回 None
    """
    # 实际项目中应该使用：
    # try:
    #     payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
    #     username: str = payload.get("sub")
    #     return username
    # except JWTError:
    #     return None
    
    # 这里为了演示简化，直接解析 token_username 格式
    if token.startswith("token_"):
        return token.replace("token_", "")
    return None


# ========== 其他工具函数 ==========


def generate_id() -> int:
    """
    生成唯一 ID（简化版，生产环境应使用数据库自增或 UUID）
    
    Returns:
        整数 ID
    """
    # 实际项目中由数据库自动生成
    import time
    return int(time.time() * 1000) % 1000000


def get_current_timestamp() -> datetime:
    """
    获取当前时间戳
    
    Returns:
        当前时间
    """
    return datetime.now()

